/*
 * IndiceArbolB.h
 *
 *  Created on: 15/10/2009
 *      Author: andres
 */

#ifndef INDICEARBOLB_H_
#define INDICEARBOLB_H_

/*
 *
 */
#include "EstrategiaIndice.h"
#include "NodoArbolB.h"

class NodoArbolB;

class IndiceArbolB: public EstrategiaIndice
{
public:
	/**
	  * Constructor Indice Primario
	  *
	  * Crea un Indice primario a con el key indicado
	  * tira IndexException si la key es NULL
	  *
	  * @author andres
	  *
	  * @param PrymaryKey* primary key del dato a indexar
	  *
	  */
	IndiceArbolB(PrimaryKey* primaryKey) throw(IndexException);

	/**
	  * Constructor Indice Secundario
	  *
	  * Crea un indice Secundario a partir del indice secundario dado
	  * tira IndexException si las key o el indice es NULL
	  *
	  * @author andres
	  *
	  * @param SecundaryKey* key que se utiliza en el indice
	  *
	  * @param PrimaryKey* key para buscar en el indice primario
	  *
	  * @param EstrategiaIndice* Indice primario en el cual buscar
	  *
	  */
	IndiceArbolB(PrimaryKey* PrimaryKey, SecondaryKey* secondaryKey, EstrategiaIndice* indicePrimario) throw(IndexException);


	virtual ~IndiceArbolB();

	/**
	  * Cargar
	  *
	  * Carga el dato en el indice
	  *
	  * En caso de inidce primario si el identificador esta repetido
	  * tira IndexException
	  *
	  * @author andres
	  *
	  * @param void* dato serializado a agregar en el indice
	  *
	  * @param int id en que esta guardado el dato
	  *
	  */
	virtual void Cargar(char* datoSerializadoACargar, unsigned int id) throw(IndexException);


	/**
	  * Buscar
	  *
	  * Busca todos los datos indexados con la clave dada
	  *
	  * @author andres
	  *
	  * @param std::string clave que se busca en el indice
	  *
	  * @return std::vector<int> vector con los id de los resultados encontrados
	  *
	  */
	virtual std::vector<unsigned int> Buscar(std::string claveABuscar);


	/**
	  * Modificar
	  *
	  * cambia los datos en el indice
	  *
	  * @author andres
	  *
	  * @param DatoSerializadoSinModificar datos serializados sin modificar
	  *
	  * @param DatosSerializadoModificado datos serializados modificados
	  *
	  * @param idModificado id de los datos modificados
	  *
	  */
	virtual void Modificar(char* DatoSerializadoSinModificar, char* DatoSerializadoModificado, unsigned int idModificado);

	/**
	  * Eliminar
	  *
	  * Elimina el dato del indice
	  *
	  * @author andres
	  *
	  * @param DatoSeralizadoAEliminar
	  *
	  */
	virtual void Eliminar(char* DatoSerializadoAEliminar);






private:

	Informacion* CargarInformacion(char* datoSerializadoACargar, unsigned int id);

	NodoArbolB* raiz;


};

#endif /* INDICEARBOLB_H_ */
